/*************************************************************************
	> File Name: read_socket.c
	> Author: 李远远
	> Mail: 
	> Created Time: 2018年08月27日 星期一 13时47分44秒
 ************************************************************************/

#include <read_socket.h>
#include <stdio.h>

/*
 * 函数名:read_socket
 * 功能:接收客户端的消息处理函数
	接收:从客户端接收
		1.登录信息					标识：#ADMI#	通过数据库接收消息管道,发送给数据库操作线程
		2.设备控制信息				标识：#DEVI#	通过向M0板发送消息管道,发送给向M0板发送消息线程
		3.修改配置信息				标识：#PZXG#	通过数据库接收消息管道,发送给数据库操作线程,通过采集消息线程管道发送给采集消息线程,
		4.查询历史信息				标识：#CXLS#	通过数据库接收消息管道,发送给数据库操作线程
		5.如果登录成功				标识：#DLOK#	通过采集消息线程管道,把客户端登录状态信息发送给采集消息线程
 * 参数:int socketID:要接收消息的客户端连接socketID
 * 返回值:成功返回接收字节数,错误返回ERR
 */
void *socket_read_pthread(void *socketID)
{
	int ret = 0;
	int fifo_fd;
	int sockID = *(int *)socketID;
	fifo *p = (fifo *)malloc(sizeof(fifo));
	p->sockID = sockID;
	
	pthread_t p1;
	
	pthread_create(&p1, NULL, socket_write_pthread, socketID);	
	printf("socket**********read xian cheng chuang jian cheng gong:%d\n", sockID);
	
	while(1)
	{
		memset(p, 0, sizeof(fifo));
		ret = read(sockID, p->buf, BUF_SIZE);
		//printf("s1ocket_read_pthread:%s\n",  p->buf);
		if (0 >= ret)
		{
			perror("socket**********socket_read_pthread:read error");
			pthread_cancel(p1);
			close(sockID);
			free(p);
			printf("socket**********ke hu duan lian jie duan kai:%d\n", sockID);
			
			int fifo_fd;
			adm_state adm_sta;
			adm_sta.state = 0;
			adm_sta.sockID = 0;
			
			memcpy(p->buf, DLOK, strlen(DLOK));
			memcpy(p->buf + strlen(DLOK), &adm_sta, sizeof(adm_state));
			
			fifo_fd = open(COLLECT_DATA_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
			return ;
		}
		
		if (0 == memcmp(p->buf, ADMI, strlen(ADMI)))		//登录信息
		{printf("socket**********deng lu xin xi\n");
			fifo_fd = open(SQLITE_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, DEVI, strlen(DEVI)))	//设备控制信息
		{printf("socket**********she bei kong zhi xin xi\n");
			fifo_fd = open(TOWARD_M0_FIFO, O_RDWR);
			write(fifo_fd, &p->buf, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, PZXG, strlen(PZXG)))	//修改配置信息
		{printf("socket**********xiu gai pei zhi xin xi\n");
			fifo_fd = open(COLLECT_DATA_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, LSSJ, strlen(LSSJ)))	//查询历史信息
		{printf("socket**********cha xun li shi xin xi\n");
			fifo_fd = open(SQLITE_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, ZCZH, strlen(ZCZH)))	//注册账号信息
		{printf("socket**********zhu ce zhang hao xin xi\n");
			fifo_fd = open(SQLITE_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, TJKH, strlen(TJKH)))	//添加门卡
		{printf("socket**********tian jia man ka xin xi\n");
			fifo_fd = open(SQLITE_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
		else if (0 == memcmp(p->buf, ZDKZ, strlen(ZDKZ)) || 0 == memcmp(p->buf, SDKZ, strlen(SDKZ)))	//添加门卡
		{printf("socket**********shou dong / zi dong qie huan\n");
			fifo_fd = open(COLLECT_DATA_FIFO, O_RDWR);
			write(fifo_fd, p, sizeof(fifo));
			close(fifo_fd);
		}
	}
	return ;
}



